package com.foodorder.service;

import com.foodorder.entity.DeliveryStaff;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 配送员服务接口
 */
public interface DeliveryStaffService {

    /**
     * 根据ID查询配送员
     *
     * @param id 配送员ID
     * @return 配送员信息
     */
    Optional<DeliveryStaff> findById(Long id);
    
    /**
     * 根据手机号查询配送员
     *
     * @param phone 手机号
     * @return 配送员信息
     */
    Optional<DeliveryStaff> findByPhone(String phone);
    
    /**
     * 配送员登录
     *
     * @param phone 手机号
     * @param password 密码
     * @return 登录结果，包含配送员信息和token
     */
    Map<String, Object> login(String phone, String password);
    
    /**
     * 保存配送员信息
     *
     * @param staff 配送员信息
     * @return 保存后的配送员信息
     */
    DeliveryStaff save(DeliveryStaff staff);
    
    /**
     * 更新配送员状态
     *
     * @param id 配送员ID
     * @param workingStatus 工作状态
     * @return 更新后的配送员信息
     */
    DeliveryStaff updateWorkingStatus(Long id, DeliveryStaff.WorkingStatus workingStatus);
    
    /**
     * 更新配送员位置
     *
     * @param id 配送员ID
     * @param latitude 纬度
     * @param longitude 经度
     * @return 更新后的配送员信息
     */
    DeliveryStaff updateLocation(Long id, BigDecimal latitude, BigDecimal longitude);
    
    /**
     * 查询附近可接单的配送员
     *
     * @param storeId 门店ID
     * @param latitude 纬度
     * @param longitude 经度
     * @param distance 距离（公里）
     * @return 配送员列表
     */
    List<DeliveryStaff> findNearbyAvailableStaff(Long storeId, BigDecimal latitude, BigDecimal longitude, double distance);
    
    /**
     * 分配订单给配送员
     *
     * @param orderId 订单ID
     * @param staffId 配送员ID
     * @return 是否分配成功
     */
    boolean assignOrder(Long orderId, Long staffId);
    
    /**
     * 配送员接单
     *
     * @param orderId 订单ID
     * @param staffId 配送员ID
     * @return 是否接单成功
     */
    boolean acceptOrder(Long orderId, Long staffId);
    
    /**
     * 配送员取餐
     *
     * @param orderId 订单ID
     * @param staffId 配送员ID
     * @return 是否取餐成功
     */
    boolean pickupOrder(Long orderId, Long staffId);
    
    /**
     * 配送员完成配送
     *
     * @param orderId 订单ID
     * @param staffId 配送员ID
     * @return 是否完成配送成功
     */
    boolean completeDelivery(Long orderId, Long staffId);
} 